"""
项目简介
计数器函数

知识模块
Python 编程语言
知识点
闭包与装饰器
受众
初级测试开发工程师
初级Python开发工程师
作业要求
编写一个Python程序，实现一个计数器函数，该函数能够记录特定函数的调用次数。你需要使用闭包和装饰器来实现这个功能。

解题思路
定义一个外部函数作为装饰器，它将创建一个闭包来保存计数器变量。

在闭包内部，定义一个计数器变量并初始化为0。

创建一个内部函数，用于实际执行被装饰的函数，并在其中将计数器递增。

返回内部函数作为闭包的结果。

将装饰器应用到需要计数的函数上。

"""

# 定义装饰器函数
def count_calls(func):
    count = 0  # 初始化计数器变量

    def wrapper(*args, **kwargs):
        nonlocal count
        count += 1
        print(f"函数 '{func.__name__}' 已被调用 {count} 次。")
        return func(*args, **kwargs)  # 调用原始函数

    return wrapper


# 使用装饰器来计数函数调用
@count_calls
def greet(name):
    return f"Hello, {name}!"


# 调用被装饰的函数
print(greet("Alice"))
print(greet("Bob"))
print(greet("Charlie"))


"""
def count_calls(func):定义了装饰器函数 count_calls，它接受一个函数 func 作为参数

def wrapper(*args, **kwargs):定义内部函数 wrapper，它接受任意数量的位置参数 *args 和关键字参数 **kwargs

nonlocal count:在 wrapper 内部，使用 nonlocal 关键字来声明 count 变量，这使得闭包内部能够修改外部函数的变量。

func.__name__:用于获取函数的名称。

return func(*args, **kwargs):调用原始函数 func，并将其结果返回。

"""